package cn.kgc.tangcco.tcbd1011.no13.base.action;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.kgc.tangcco.tcbd1011.no13.base.util.Utils;

/**
 * Servlet implementation class BaseServlet
 */

/**
 * @author 22900
 *  对页面请求进行跳转或者重定向
 */
@WebServlet(name="BaseServlet",urlPatterns="/base.action")
public class BaseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	//将jsp文件地址重复的前缀抽取为一个方法
	public String prefix() {
		return "/WEB-INF/jsp/";
	}
	//将jsp文件地址重复的后缀抽取为一个方法
	public String suffix() {
		return ".jsp";
	}
	//合并前缀与后缀，并进行跳转
	public void forward( HttpServletRequest request, HttpServletResponse response , String forward ) throws ServletException, IOException {
		StringBuffer sb = new StringBuffer();
		//使用增强型字符串进行拼接。并执行toString方法返回一个String类型
		String pageName = sb.append(prefix()).append(forward).append(suffix()).toString();
		//执行跳转页面
		request.getRequestDispatcher(pageName).forward(request, response);
	}
	//重写父类请求方法
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置页面回传的数据字符集为utf-8
		request.setCharacterEncoding("utf-8");
		//获得页面传回的methodName的值，值是当前类的方法名
		String methodName = request.getParameter(Utils.METHODNAME);
		//先判断是否为null 或是否为空
		if ( methodName!=null && !methodName.isEmpty() ) {
			//通过反射获得方法
			try {
				//反射获得当前子类的方法（包括私有的），形参为，方法名，形参类的类型
				Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
				//执行获得的方法，形参是 方法在哪个类上， 与实参对象
				String forward = (String)method.invoke(this, request,response);
				//判断是否使用AJAX，
				if (!forward.equals(Utils.AJAX)) {
					//判断方法名前缀是以doAdd 或 doUpdate 或 doDelete 开始的 就执行重定向方法
					if ( methodName.startsWith(Utils.REDIRECEDOADD) || methodName.startsWith(Utils.REDIRECEDOUPDATE) 
							|| methodName.startsWith(Utils.REDIRECEDODELETE)) {
						//调用重定向刷新list界面
						response.sendRedirect(forward);
					}else {
						//不满足条件的方法就进行跳转操作
						this.forward(request, response, forward);
					}
				}				
			} catch (NoSuchMethodException e) {
				e.printStackTrace();
				System.out.println("找不到方法名");
			} catch (SecurityException e) {
				e.printStackTrace();
				System.out.println("Java安全异常,method赋值错误");
			} catch (IllegalAccessException e) {
				System.out.println("调用的方法是private修饰的");
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				System.out.println("方法传递了一个不合法或不正确的参数");
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				System.out.println("调用的方法的内部抛出了异常而没有被捕获");
				e.printStackTrace();
			}
		}else {
			//methodName为空或null时返回login界面
			this.forward(request, response, "jsp/login");
		}
	}
	
}
